package cn.bone.mima.desaes;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class DesDemo {
    public static void main(String[] args) throws Exception {
//        encryptDES();
        decryptDES();
    }

    public static void encryptDES() throws Exception{
        // 原文
        String input = "武汉";
        // 定义key
        // 如果使用DES进行加密，秘钥必须是8个字节
        String key = "12345678";
        // 算法
        String transformation = "DES";
        // 加密类型
        String algorithm = "DES";

        // 创建加密对象
        Cipher cipher = Cipher.getInstance(transformation);

        // 创建加密规则
        // 第一个参数表示key的字节
        // 第二个参数表示加密的类型（不是算法）
        SecretKey secretKey = new SecretKeySpec(key.getBytes(), algorithm);
        // 进行加密初始化
        // 第一个参数表示模式：加密模式，解密模式
        // 第二个参数表示加密规则
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);

        // 调用加密方法
        // 参数表示原文的字节数组
        byte[] bytes = cipher.doFinal(input.getBytes());

        // 可以看到打印的字节里面有负数，在ascii里面找不到对应的字符
        for(byte aByte : bytes){
            int i = aByte;
            System.out.println(i);
        }

        // 打印密文，如果直接打印密文会出现乱码
        // �!�R����
        System.out.println(new String(bytes));

        // 使用base64编码
        byte[] encode = Base64.getEncoder().encode(bytes);
        // 9iGRUrCF//I=
        System.out.println(new String(encode));
    }

    public static void decryptDES() throws Exception {
        // 原文
        String input = "9iGRUrCF//I=";
        // 定义key
        // 如果使用DES进行加密，秘钥必须是8个字节
        String key = "12345678";
        // 算法
        String transformation = "DES";
        // 加密类型
        String algorithm = "DES";

        // 创建加密对象
        Cipher cipher = Cipher.getInstance(transformation);

        // 创建加密规则
        // 第一个参数表示key的字节
        // 第二个参数表示加密的类型（不是算法）
        SecretKey secretKey = new SecretKeySpec(key.getBytes(), algorithm);
        // 进行加密初始化
        // 第一个参数表示模式：加密模式，解密模式
        // 第二个参数表示加密规则
        cipher.init(Cipher.DECRYPT_MODE, secretKey);

        // 使用base64对密文解码
        byte[] decode = Base64.getDecoder().decode(input.getBytes());

        // 调用解密方法
        // 参数表示密文的字节数组
        byte[] bytes = cipher.doFinal(decode);

        // 武汉
        System.out.println(new String(bytes));
    }
}
